#include <iostream>
#include "list.h"
#include "list.h"
#include<string>

using namespace std;



/********************************************************/
/********************************************************/
/*                       LISTA                          */
/*                                                      */

// Construtor do no'
node::node(){
    figura = NULL;
    next = NULL;
}

// Construtor de list
list::list(){
    head.next = NULL;
    tail = &head;
    this->tamanho=0;
}

// Verifica se a lista e' vazia
int list::vazia(){
    if(this->tamanho==0) return 1;
    else return 0;
}

// Retorna item na posicao i
node* list::getItem(int i){
    node *nodeAux=NULL;
    int n;
    
    if ( i >= 1 && i <= this->tamanho ){
        nodeAux=this->head.next;
        for(n=1;n<i;n++)
            nodeAux=nodeAux->next;
        return nodeAux;
    }
    return nodeAux;
}

// Retorna o ultimo da lista
node* list::getUltimo(){
    return getItem(this->tamanho);
}

// Insere um no numa dada posicao
int list::inserirPosicao(fig *new_fig,int i){
    node *pre, *pos;
    node *new_node = new node;
    new_node->figura = new_fig;
    
    if (i < 1 || i > this->tamanho+1) return 0;
    if (i == 1){
        pos=this->head.next;
        this->head.next=new_node;
        new_node->next=pos;
    } else {
        pre=getItem(i-1);
        pos=pre->next;
        pre->next=new_node;
        new_node->next=pos;
    }
    // Incrementa o tamanho da lista
    this->tamanho++;
    return 1;
}
    

void list::inserir(fig *new_fig){
    inserirPosicao(new_fig,this->tamanho+1);
}

// Remove o elemento numa dada posicao
int list::removerPosicao(int i){
    node *pre, *pos;
    if (i < 1 || i > this->tamanho) return 0;
    if (i == 1){
        pre=this->head.next->next;
        free(this->head.next->figura);
        free(this->head.next);
        this->head.next=pre;
    } else {
        pre=getItem(i-1);
        pos=pre->next->next;
        free(pre->next->figura);
        free(pre->next);
        pre->next=pos;
    }
    this->tamanho--;
}



// REMOVER figura, tendo "nome" da figura como argumento
int list::removerFig(std::string nome){
    node *aux;
    fig *figAux;
    int i=0;
    
    if(this->vazia()) cout << "Lista vazia"  << endl;
    else {
        aux=this->head.next;    
        while(aux!=NULL){
            i++;
            figAux=aux->figura;
            if(strcmp(aux->figura->myName().c_str(),nome.c_str())==0){
                removerPosicao(i);
                return 1;
            }
            aux=aux->next;
        }
    }
    return 0;
}

/*                      FIM LISTA                       */
/*                                                      */
/********************************************************/
/********************************************************/



